home *** CD-ROM | disk | FTP | other *** search
-
-
-
- CCCCCCCCFFFFFFFFTTTTMMMMRRRR((((3333SSSS)))) CCCCCCCCFFFFFFFFTTTTMMMMRRRR((((3333SSSS))))
-
-
-
- NNNNAAAAMMMMEEEE
- CCCCCCCCFFFFFFFFTTTTMMMMRRRR, ZZZZZZZZFFFFFFFFTTTTMMMMRRRR - Applies multiple complex-to-complex Fast Fourier
- Transforms (FFTs) to the rows of a two-dimensional (2D) array
-
- SSSSYYYYNNNNOOOOPPPPSSSSIIIISSSS
- Single precision complex -> Single precision complex
-
- Fortran:
- CCCCAAAALLLLLLLL CCCCCCCCFFFFFFFFTTTTMMMMRRRR ((((_i_s_i_g_n,,,, _n,,,, _l_o_t,,,, _s_c_a_l_e,,,, _x,,,, _l_d_x,,,, _y,,,, _l_d_y,,,, _t_a_b_l_e,,,,
- _w_o_r_k,,,, _i_s_y_s))))
-
- C/C++:
- ####iiiinnnncccclllluuuuddddeeee <<<<ssssccccssssllll____fffffffftttt....hhhh>>>>
- iiiinnnntttt ccccccccffffffffttttmmmmrrrr ((((iiiinnnntttt _i_s_i_g_n,,,, iiiinnnntttt _n,,,, iiiinnnntttt _l_o_t,,,, ffffllllooooaaaatttt _s_c_a_l_e,,,,
- ssssccccssssllll____ccccoooommmmpppplllleeeexxxx *_x,,,, iiiinnnntttt _l_d_x,,,, ssssccccssssllll____ccccoooommmmpppplllleeeexxxx *_y,,,, iiiinnnntttt _l_d_y,,,, ffffllllooooaaaatttt
- *_t_a_b_l_e,,,, ffffllllooooaaaatttt *_w_o_r_k,,,, iiiinnnntttt *_i_s_y_s))));;;;
-
- C++ STL:
- ####iiiinnnncccclllluuuuddddeeee <<<<ccccoooommmmpppplllleeeexxxx....hhhh>>>>
- ####iiiinnnncccclllluuuuddddeeee <<<<ssssccccssssllll____fffffffftttt....hhhh>>>>
- iiiinnnntttt ccccccccffffffffttttmmmmrrrr ((((iiiinnnntttt *_i_s_i_g_n,,,, iiiinnnntttt *_n,,,, iiiinnnntttt *_l_o_t,,,, ffffllllooooaaaatttt *_s_c_a_l_e,,,,
- ccccoooommmmpppplllleeeexxxx<<<<ffffllllooooaaaatttt>>>> *_x,,,, iiiinnnntttt *_l_d_x,,,, ccccoooommmmpppplllleeeexxxx<<<<ffffllllooooaaaatttt>>>> *_y,,,, iiiinnnntttt *_l_d_y,,,, ffffllllooooaaaatttt
- *_t_a_b_l_e,,,, ffffllllooooaaaatttt *_w_o_r_k,,,, iiiinnnntttt *_i_s_y_s))));;;;
-
- Double precision complex -> Double precision complex
-
- Fortran:
- CCCCAAAALLLLLLLL ZZZZZZZZFFFFFFFFTTTTMMMMRRRR ((((_i_s_i_g_n,,,, _n,,,, _l_o_t,,,, _s_c_a_l_e,,,, _x,,,, _l_d_x,,,, _y,,,, _l_d_y,,,, _t_a_b_l_e,,,,
- _w_o_r_k,,,, _i_s_y_s))))
-
- C/C++:
- ####iiiinnnncccclllluuuuddddeeee <<<<ssssccccssssllll____fffffffftttt....hhhh>>>>
- iiiinnnntttt zzzzzzzzffffffffttttmmmmrrrr ((((iiiinnnntttt _i_s_i_g_n,,,, iiiinnnntttt _n,,,, iiiinnnntttt _l_o_t,,,, ddddoooouuuubbbblllleeee _s_c_a_l_e,,,,
- ssssccccssssllll____zzzzoooommmmpppplllleeeexxxx *_x,,,, iiiinnnntttt _l_d_x,,,, ssssccccssssllll____zzzzoooommmmpppplllleeeexxxx *_y,,,, iiiinnnntttt _l_d_y,,,, ddddoooouuuubbbblllleeee
- *_t_a_b_l_e,,,, ddddoooouuuubbbblllleeee *_w_o_r_k,,,, iiiinnnntttt *_i_s_y_s))));;;;
-
- C++ STL:
- ####iiiinnnncccclllluuuuddddeeee <<<<ccccoooommmmpppplllleeeexxxx....hhhh>>>>
- ####iiiinnnncccclllluuuuddddeeee <<<<ssssccccssssllll____fffffffftttt....hhhh>>>>
- iiiinnnntttt zzzzzzzzffffffffttttmmmmrrrr ((((iiiinnnntttt *_i_s_i_g_n,,,, iiiinnnntttt *_n,,,, iiiinnnntttt *_l_o_t,,,, ddddoooouuuubbbblllleeee *_s_c_a_l_e,,,,
- ccccoooommmmpppplllleeeexxxx<<<<ddddoooouuuubbbblllleeee>>>> *_x,,,, iiiinnnntttt *_l_d_x,,,, ccccoooommmmpppplllleeeexxxx<<<<ddddoooouuuubbbblllleeee>>>> *_y,,,, iiiinnnntttt *_l_d_y,,,,
- ddddoooouuuubbbblllleeee *_t_a_b_l_e,,,, ddddoooouuuubbbblllleeee *_w_o_r_k,,,, iiiinnnntttt *_i_s_y_s))));;;;
-
- IIIIMMMMPPPPLLLLEEEEMMMMEEEENNNNTTTTAAAATTTTIIIIOOOONNNN
- These routines are part of the SCSL Scientific Library and can be loaded
- using either the ----llllssssccccssss or the ----llllssssccccssss____mmmmpppp option. The ----llllssssccccssss____mmmmpppp option
- directs the linker to use the multi-processor version of the library.
-
- When linking to SCSL with ----llllssssccccssss or ----llllssssccccssss____mmmmpppp, the default integer size is
- 4 bytes (32 bits). Another version of SCSL is available in which integers
- are 8 bytes (64 bits). This version allows the user access to larger
- memory sizes and helps when porting legacy Cray codes. It can be loaded
-
-
-
- PPPPaaaaggggeeee 1111
-
-
-
-
-
-
- CCCCCCCCFFFFFFFFTTTTMMMMRRRR((((3333SSSS)))) CCCCCCCCFFFFFFFFTTTTMMMMRRRR((((3333SSSS))))
-
-
-
- by using the ----llllssssccccssss____iiii8888 option or the ----llllssssccccssss____iiii8888____mmmmpppp option. A program may use
- only one of the two versions; 4-byte integer and 8-byte integer library
- calls cannot be mixed.
-
- The C and C++ prototypes shown above are appropriate for the 4-byte
- integer version of SCSL. When using the 8-byte integer version, the
- variables of type iiiinnnntttt become lllloooonnnngggg lllloooonnnngggg and the <<<<ssssccccssssllll____fffffffftttt____iiii8888....hhhh>>>> header
- file should be included.
-
- DDDDEEEESSSSCCCCRRRRIIIIPPPPTTTTIIIIOOOONNNN
- CCCCCCCCFFFFFFFFTTTTMMMMRRRR/ZZZZZZZZFFFFFFFFTTTTMMMMRRRR computes the FFT of each row of the complex matrix _X, and
- stores the results in the rows of complex matrix _Y.
-
- Suppose the arrays are declared as follows:
-
- Fortran:
-
- COMPLEX X(0:ldx-1, 0:n-1)
- COMPLEX Y(0:ldy-1, 0:n-1)
-
-
- C/C++:
-
- scsl_complex x[n][ldx], y[n][ldy];
-
-
- C++ STL:
-
- complex<float> x[n][ldx], y[n][ldy];
-
-
- where _l_d_x >= _l_o_t, _l_d_y >= _l_o_t.
-
- Then row _L of the output array is the FFT of row _L of the input array,
- using the following formula for the FFT:
-
- n-1 isign * j * k
- Y = scale * Sum [X * w ]
- k,L j=0 j
-
-
- for _k = 0, ..., _n-1
- _L = 0, ..., _l_o_t-1
-
- where:
-
- _w = exp(2*_p_i*_i/_n),
-
- _i = + sqrt(-1),
-
-
-
-
-
-
- PPPPaaaaggggeeee 2222
-
-
-
-
-
-
- CCCCCCCCFFFFFFFFTTTTMMMMRRRR((((3333SSSS)))) CCCCCCCCFFFFFFFFTTTTMMMMRRRR((((3333SSSS))))
-
-
-
- _p_i = 3.14159...,
-
- _i_s_i_g_n = +1 or -1
-
- _l_o_t = the number of rows to transform
-
- Different authors use different conventions for which of the transforms,
- _i_s_i_g_n = +1 or _i_s_i_g_n = -1, is the forward or inverse transform, and what
- the _s_c_a_l_e factor should be in either case. You can make this routine
- compute any of the various possible definitions, however, by choosing the
- appropriate values for _i_s_i_g_n and _s_c_a_l_e.
-
- The relevant fact from FFT theory is this: If you take the FFT with any
- particular values of _i_s_i_g_n and _s_c_a_l_e, the mathematical inverse function
- is computed by taking the FFT with -_i_s_i_g_n and 1/(_n * _s_c_a_l_e). In
- particular, if you use _i_s_i_g_n = +1 and _s_c_a_l_e = 1.0 for the forward FFT,
- you can compute the inverse FFT by using the following: _i_s_i_g_n = -1 and
- _s_c_a_l_e = 1.0/_n.
-
- See the NOTES section of this man page for information about the
- interpretation of the data types described in the following arguments.
-
- This routine has the following arguments:
-
- _i_s_i_g_n Integer. (input)
- Specifies whether to initialize the _t_a_b_l_e array or to do the
- forward or inverse Fourier transform, as follows:
-
- If _i_s_i_g_n = 0, the routine initializes _t_a_b_l_e and returns. In
- this case, the only arguments used or checked are _i_s_i_g_n, _n, and
- _t_a_b_l_e.
-
- If _i_s_i_g_n = +1 or -1, the value of _i_s_i_g_n is the sign of the
- exponent used in the FFT formula.
-
- _n Integer. (input)
- Size of each transform (the number of elements in each row of
- the input and output matrix to be transformed). _n >= 0; if _n =
- 0, the routine returns.
-
- _l_o_t Integer. (input)
- The number of transforms to be computed (lot size). This is
- the number of elements in each column of the input and output
- matrix. _l_o_t >= 0. If _l_o_t = 0, the routine returns.
-
- _s_c_a_l_e Scale factor. (input)
- CCCCCCCCFFFFFFFFTTTTMMMMRRRR: Single precision.
- ZZZZZZZZFFFFFFFFTTTTMMMMRRRR: Double precision.
- Each element of the output array is multiplied by the _s_c_a_l_e
- factor after taking the Fourier transform, as defined
- previously.
-
-
-
-
- PPPPaaaaggggeeee 3333
-
-
-
-
-
-
- CCCCCCCCFFFFFFFFTTTTMMMMRRRR((((3333SSSS)))) CCCCCCCCFFFFFFFFTTTTMMMMRRRR((((3333SSSS))))
-
-
-
- _x Array of dimensions (_l_d_x, _n). (input)
- CCCCCCCCFFFFFFFFTTTTMMMMRRRR: Single precision complex array.
- ZZZZZZZZFFFFFFFFTTTTMMMMRRRR: Double precision complex array.
- Input array of values to be transformed.
-
- _l_d_x Integer. (input)
- The number of rows in _x, as it was declared in the calling
- program (the leading dimension of _X). _l_d_x >= MMMMAAAAXXXX(_l_o_t, 1).
-
- _y Array of dimensions (_l_d_y, _n). (output)
- CCCCCCCCFFFFFFFFTTTTMMMMRRRR: Single precision complex array.
- ZZZZZZZZFFFFFFFFTTTTMMMMRRRR: Double precision complex array.
- Output array of transformed values. Each row of the output
- array, _y, is the FFT of the corresponding row of the input
- array, _x, computed according to the preceding formula.
-
- The output array may be the same as the input array. In that
- case, the transform is done in place. The input array is
- overwritten with the transformed values. In this case, it is
- necessary that _l_d_x = _l_d_y.
-
- _l_d_y Integer. (input)
- The number of rows in the _Y array, as it was declared in the
- calling program (the leading dimension of _Y). _l_d_y >= MMMMAAAAXXXX(_l_o_t,
- 1).
-
- _t_a_b_l_e Array of dimension (2 * _n + _N_F) (input or output)
- CCCCCCCCFFFFFFFFTTTTMMMMRRRR: Single precision array.
- ZZZZZZZZFFFFFFFFTTTTMMMMRRRR: Double precision array.
- Table of factors and roots of unity. See the description of
- the _i_s_y_s argument for the value of _N_F.
-
- If _i_s_i_g_n = 0, the routine initializes _t_a_b_l_e (_t_a_b_l_e is output
- only).
-
- If _i_s_i_g_n = +1 or -1, the values in _t_a_b_l_e are assumed to be
- initialized already by a prior call with _i_s_i_g_n = 0 (_t_a_b_l_e is
- input only).
-
- _w_o_r_k Array of dimension (2 * _n).
- CCCCCCCCFFFFFFFFTTTTMMMM: Single precision array.
- ZZZZZZZZFFFFFFFFTTTTMMMM: Double precision array.
- Work array. This is a scratch array used for intermediate
- calculations. Its address space must be different from the
- input and output arrays.
-
- _i_s_y_s Integer array dimensioned 0000........_i_s_y_s((((0000)))).
- An array that gives implementation-specific information. All
- features and functions of the FFT routines specific to any
- particular implementation are confined to this _i_s_y_s array.
-
-
-
-
-
- PPPPaaaaggggeeee 4444
-
-
-
-
-
-
- CCCCCCCCFFFFFFFFTTTTMMMMRRRR((((3333SSSS)))) CCCCCCCCFFFFFFFFTTTTMMMMRRRR((((3333SSSS))))
-
-
-
- In the Origin series implementation, _i_s_y_s((((0000))))====0000 and _i_s_y_s((((0000))))====1111
- are supported. In SCSL versions prior to 1.3, only _i_s_y_s((((0000))))====0000
- was allowed. For _i_s_y_s((((0000))))====0000, _N_F====33330000, and for _i_s_y_s((((0000))))====1111, _N_F====222255556666.
- The _N_F words of storage in the _t_a_b_l_e array contain a
- factorization of the length of the transform.
-
- The smaller value of _N_F for _i_s_y_s((((0000))))====0000 is historical. It is too
- small to store all the required factors for the highest
- performing FFT, so when _i_s_y_s((((0000))))====0000, extra space is allocated
- when the _t_a_b_l_e array is initialized. To avoid memory leaks,
- this extra space must be deallocated when the _t_a_b_l_e array is no
- longer needed. The CCCCCCCCFFFFFFFFTTTTMMMMRRRRFFFF routine is used to release this
- memory. Due to the potential for memory leaks, the use of
- _i_s_y_s((((0000))))====0000 should be avoided.
-
- For _i_s_y_s((((0000))))====1111, the value of _N_F is large enough so that no extra
- memory needs to be allocated, and there is no need to call
- CCCCCCCCFFFFFFFFTTTTMMMMRRRRFFFF to release memory. If called, it does nothing.
-
- NOTE: _i_s_y_s((((0000))))====1111 means that _i_s_y_s is an integer array with two
- elements. The second element, _i_s_y_s((((1111)))), will not be accessed.
-
- NNNNOOOOTTTTEEEESSSS
- The following data types are described in this documentation:
-
- TTTTeeeerrrrmmmm UUUUsssseeeedddd DDDDaaaattttaaaa ttttyyyyppppeeee
-
- Fortran:
-
- Array dimensioned 0000........_n----1111 XXXX((((0000::::nnnn----1111))))
-
- Array of dimensions (_m,_n) XXXX((((mmmm,,,,nnnn))))
-
- Array of dimensions (_m,_n,_p) XXXX((((mmmm,,,,nnnn,,,,pppp))))
-
- Integer IIIINNNNTTTTEEEEGGGGEEEERRRR (IIIINNNNTTTTEEEEGGGGEEEERRRR****8888 for ----llllssssccccssss____iiii8888[[[[____mmmmpppp]]]])
-
- Single precision RRRREEEEAAAALLLL
-
- Double precision DDDDOOOOUUUUBBBBLLLLEEEE PPPPRRRREEEECCCCIIIISSSSIIIIOOOONNNN
-
- Single precision complex CCCCOOOOMMMMPPPPLLLLEEEEXXXX
-
- Double precision complex DDDDOOOOUUUUBBBBLLLLEEEE CCCCOOOOMMMMPPPPLLLLEEEEXXXX
-
- C/C++:
-
- Array dimensioned 0000........_n----1111 xxxx[[[[_n]]]]
-
- Array of dimensions (_m,_n) xxxx[[[[mmmm****nnnn]]]] oooorrrr xxxx[[[[nnnn]]]][[[[mmmm]]]]
-
-
-
-
-
- PPPPaaaaggggeeee 5555
-
-
-
-
-
-
- CCCCCCCCFFFFFFFFTTTTMMMMRRRR((((3333SSSS)))) CCCCCCCCFFFFFFFFTTTTMMMMRRRR((((3333SSSS))))
-
-
-
- Array of dimensions (_m,_n,_p) xxxx[[[[mmmm****nnnn****pppp]]]] oooorrrr xxxx[[[[pppp]]]][[[[nnnn]]]][[[[mmmm]]]]
-
- Integer iiiinnnntttt (lllloooonnnngggg lllloooonnnngggg for ----llllssssccccssss____iiii8888[[[[____mmmmpppp]]]])
-
- Single precision ffffllllooooaaaatttt
-
- Double precision ddddoooouuuubbbblllleeee
-
- Single precision complex ssssccccssssllll____ccccoooommmmpppplllleeeexxxx
-
- Double precision complex ssssccccssssllll____zzzzoooommmmpppplllleeeexxxx
-
- C++ STL:
-
- Array dimensioned 0000........_n----1111 xxxx[[[[_n]]]]
-
- Array of dimensions (_m,_n) xxxx[[[[mmmm****nnnn]]]] oooorrrr xxxx[[[[nnnn]]]][[[[mmmm]]]]
-
- Array of dimensions (_m,_n,_p) xxxx[[[[mmmm****nnnn****pppp]]]] oooorrrr xxxx[[[[pppp]]]][[[[nnnn]]]][[[[mmmm]]]]
-
- Integer iiiinnnntttt (lllloooonnnngggg lllloooonnnngggg for ----llllssssccccssss____iiii8888[[[[____mmmmpppp]]]])
-
- Single precision ffffllllooooaaaatttt
-
- Double precision ddddoooouuuubbbblllleeee
-
- Single precision complex ccccoooommmmpppplllleeeexxxx<<<<ffffllllooooaaaatttt>>>>
-
- Double precision complex ccccoooommmmpppplllleeeexxxx<<<<ddddoooouuuubbbblllleeee>>>>
-
- CCCCAAAAUUUUTTTTIIIIOOOONNNNSSSS
- Transform sizes with a prime factor exceeding 22223332222----1111 are not supported for
- the 8-byte integer version of the library.
-
- In addition to the _w_o_r_k array, the FFT routines also dynamically allocate
- scratch space from the stack. The amount of space allocated can be
- slightly bigger than the size of the largest processor cache. For single
- processor runs, the default stack size is large enough that these
- allocations generally cause no problems. But for parallel runs, you need
- to ensure that the stack size of slave threads is big enough to hold this
- scratch space. Failure to reserve sufficient stack space will cause
- programs to dump core due to stack overflows. The stack size of MP
- library slave threads is controlled via the MMMMPPPP____SSSSLLLLAAAAVVVVEEEE____SSSSTTTTAAAACCCCKKKKSSSSIIIIZZZZEEEE
- environment variable or the mmmmpppp____sssseeeetttt____ssssllllaaaavvvveeee____ssssttttaaaacccckkkkssssiiiizzzzeeee(((()))) library routine. See
- the mmmmpppp(3C), mmmmpppp(3F) and ppppeeee____eeeennnnvvvviiiirrrroooonnnn(5) reference pages for more information
- on controlling the slave stack size. For pthreads applications, the
- thread's stack size is specified as one of many creation attributes
- provided in the pthread_attr_t argument to pppptttthhhhrrrreeeeaaaadddd____ccccrrrreeeeaaaatttteeee(3P). The
- stacksize attribute should be set explicitly to a non-default value using
- the pppptttthhhhrrrreeeeaaaadddd____aaaattttttttrrrr____sssseeeettttssssttttaaaacccckkkkssssiiiizzzzeeee(3P) call, described in the
- pppptttthhhhrrrreeeeaaaadddd____aaaattttttttrrrr____iiiinnnniiiitttt(3P) man page.
-
-
-
-
- PPPPaaaaggggeeee 6666
-
-
-
-
-
-
- CCCCCCCCFFFFFFFFTTTTMMMMRRRR((((3333SSSS)))) CCCCCCCCFFFFFFFFTTTTMMMMRRRR((((3333SSSS))))
-
-
-
- Care must be exercised if copies of the _t_a_b_l_e array are used: even though
- a copy exists, the original must persist. As an example, the following
- code will nnnnooootttt work:
-
- #include <scsl_fft.h>
- scsl_complex x[131][65], y[131][65];
- float table[2*128 + 256];
- float work[2*128];
- int isys[2];
- isys[0] = 1;
- {
- float table_orig[2*128 + 256];
-
- ccfftmr(0, 128, 64, 1.0f, (scsl_complex *) x, 65,
- (scsl_complex *) y, 65, table_orig, work, isys);
- bcopy(table_orig, table, (2*128+256)*sizeof(float));
- }
- ccfftmr(1, 128, 64, 1.0f, (scsl_complex *) x, 65,
- (scsl_complex *) y, 65, table, work, isys);
-
-
- In this example, because _t_a_b_l_e__o_r_i_g is a stack variable that does not
- persist outside of the code block delimited by the braces, the data in
- the copy, _t_a_b_l_e, are not guaranteed to be valid. However, the following
- code will work because _t_a_b_l_e__o_r_i_g is persistent:
-
- #include <scsl_fft.h>
- scsl_complex x[131][65], y[131][65];
- float table_orig[2*128 + 256];
- float table[2*128 + 256];
- float work[2*128];
- int isys[2];
- isys[0] = 1;
- ccfftmr(0, 128, 64, 1.0f, (scsl_complex *) x, 65,
- (scsl_complex *) y, 65, table_orig, work, isys);
- bcopy(table_orig, table, (2*128+256)*sizeof(float));
- ccfftmr(1, 128, 64, 1.0f, (scsl_complex *) x, 65,
- (scsl_complex *) y, 65, table, work, isys);
-
-
- EEEEXXXXAAAAMMMMPPPPLLLLEEEESSSS
- The following examples are for Origin series only.
-
- Example 1: Initialize the _t_a_b_l_e array in preparation for doing FFTs of
- size 128. Only the _i_s_i_g_n, _n, and _t_a_b_l_e arguments are used in this case.
- You can use dummy arguments or zeros for the other arguments in the
- subroutine call.
-
- Fortran:
-
- REAL TABLE(2*128 + 256)
- CALL CCFFTMR(0, 128, 0, 0.0, DUMMY, 1, DUMMY, 1,
-
-
-
- PPPPaaaaggggeeee 7777
-
-
-
-
-
-
- CCCCCCCCFFFFFFFFTTTTMMMMRRRR((((3333SSSS)))) CCCCCCCCFFFFFFFFTTTTMMMMRRRR((((3333SSSS))))
-
-
-
- & TABLE, DUMMY, 0)
-
-
- C/C++:
-
- #include <scsl_fft.h>
- float table[2*128 + 256];
- int isys[2];
- isys[0] = 1;
- ccfftmr(0, 128, 0, 0.0f, NULL, 1, NULL, 1,
- table, NULL, isys);
-
-
- C++ STL:
-
- #include <complex.h>
- #include <scsl_fft.h>
- float table[2*128 + 256];
- int isys[2];
- isys[0] = 1;
- ccfftmr(0, 128, 0, 0.0f, NULL, 1, NULL, 1,
- table, NULL, isys);
-
-
- Example 2: XXXX and YYYY are complex arrays dimensioned (0...64) by
- (0...130). The first 64 elements of each column contain data. For
- performance reasons, the extra element forces the leading dimension to be
- an odd number. Take the FFT of the first 64 rows of XXXX and store the
- results in the first 64 rows of YYYY. Before taking the FFT, initialize the
- TTTTAAAABBBBLLLLEEEE array, as in example 1.
-
- Fortran:
-
- COMPLEX X(0:64, 0:130)
- COMPLEX Y(0:64, 0:130)
- REAL TABLE(2*128 + 256)
- REAL WORK(2*128)
- INTEGER ISYS(0:1)
- ISYS(0) = 1
- CALL CCFFTMR(0, 128, 64, 1.0, X, 65, Y, 65, TABLE, WORK, ISYS)
- CALL CCFFTMR(1, 128, 64, 1.0, X, 65, Y, 65, TABLE, WORK, ISYS)
-
-
- C/C++:
-
- #include <scsl_fft.h>
- scsl_complex x[131][65], y[131][65];
- float table[2*128 + 256];
- float work[2*128];
- int isys[2];
- isys[0] = 1;
- ccfftmr(0, 128, 64, 1.0f, (scsl_complex *) x, 65,
-
-
-
- PPPPaaaaggggeeee 8888
-
-
-
-
-
-
- CCCCCCCCFFFFFFFFTTTTMMMMRRRR((((3333SSSS)))) CCCCCCCCFFFFFFFFTTTTMMMMRRRR((((3333SSSS))))
-
-
-
- (scsl_complex *) y, 65, table, work, isys);
- ccfftmr(1, 128, 64, 1.0f, (scsl_complex *) x, 65,
- (scsl_complex *) y, 65, table, work, isys);
-
-
- C++ STL:
-
- #include <complex.h>
- #include <scsl_fft.h>
- complex<float> x[131][65], y[131][65];
- float table[2*128 + 128];
- float work[2*128];
- int isys[2];
- isys[0] = 1;
- ccfftmr(0, 128, 64, 1.0f, (complex<float> *) x, 65,
- (complex<float> *) y, 65, table, work, isys);
- ccfftmr(1, 128, 64, 1.0f, (complex<float> *) x, 65,
- (complex<float> *) y, 65, table, work, isys);
-
-
- Example 3: With XXXX and YYYY as in example 2, take the inverse FFT of YYYY and
- store it back in XXXX. The _s_c_a_l_e factor 1/128 is used. Assume that the
- TTTTAAAABBBBLLLLEEEE array is already initialized.
-
- Fortran:
-
- CALL CCFFTMR(-1, 128, 64, 1.0/128.0, Y, 65, X, 65,
- & TABLE,WORK,0)
-
-
- C/C++:
-
- ccfftmr(-1, 128, 64, 1.0f/128.0f, (scsl_complex *) y, 65,
- (scsl_complex *) x, 65, table, work, isys);
-
-
- C++ STL:
-
- ccfftmr(-1, 128, 64, 1.0f/128.0f, (complex<float> *) y, 65,
- (complex<float> *) x, 65, table, work, isys);
-
-
- Example 4: Perform the same computation as in example 4, but put the
- output back in array _X to save storage space. Use the 8-byte integer
- version of SCSL.
-
- Fortran:
-
- COMPLEX X(0:64, 0:130)
- REAL TABLE(2*128 + 256)
- REAL WORK(2*128)
- INTEGER*8 ISYS(0:1)
-
-
-
- PPPPaaaaggggeeee 9999
-
-
-
-
-
-
- CCCCCCCCFFFFFFFFTTTTMMMMRRRR((((3333SSSS)))) CCCCCCCCFFFFFFFFTTTTMMMMRRRR((((3333SSSS))))
-
-
-
- ISYS(0) = 1_8
- CALL CCFFTMR(0_8, 128_8, 64_8, 1.0, X, 65_8, X, 65_8,
- & TABLE, WORK, ISYS)
- CALL CCFFTMR(1_8, 128_8, 64_8, 1.0, X, 65_8, X, 65_8,
- & TABLE, WORK, ISYS)
-
-
- C/C++:
-
- #include <scsl_fft_i8.h>
- scsl_complex x[131][65], y[131][65];
- float table[2*128 + 256];
- float work[2*128];
- long long isys[2];
- isys[0] = 1LL;
- ccfftmr(0LL, 128LL, 64LL, 1.0f, (scsl_complex *) x, 65LL,
- (scsl_complex *) x, 65LL, table, work, isys);
- ccfftmr(1LL, 128LL, 64LL, 1.0f, (scsl_complex *) x, 65LL,
- (scsl_complex *) x, 65LL, table, work, isys);
-
-
- C++ STL:
-
- #include <complex.h>
- #include <scsl_fft_i8.h>
- complex<float> x[131][65], y[131][65];
- float table[2*128 + 256];
- float work[2*128];
- long long isys[2];
- isys[0] = 1LL;
- ccfftmr(0LL, 128LL, 64LL, 1.0f, (complex<float> *) x, 65LL,
- (complex<float> *) x, 65LL, table, work, isys);
- ccfftmr(1LL, 128LL, 64LL, 1.0f, (complex<float> *) x, 65LL,
- (complex<float> *) x, 65LL, table, work, isys);
-
-
- Example 5: Perform the same computation as in example 2, but assume that
- the lower bound of each Fortran array is 1, rather than 0. The
- subroutine calls are not changed.
-
- Fortran:
-
- COMPLEX X(65, 131)
- COMPLEX Y(65, 131)
- CALL CCFFTMR(0, 128, 64, 1.0, X, 65, Y, 65, TABLE, WORK, ISYS)
- CALL CCFFTMR(1, 128, 64, 1.0, X, 65, Y, 65, TABLE, WORK, ISYS)
-
-
- SSSSEEEEEEEE AAAALLLLSSSSOOOO
- IIIINNNNTTTTRRRROOOO____FFFFFFFFTTTT(3S), IIIINNNNTTTTRRRROOOO____SSSSCCCCSSSSLLLL(3S), CCCCCCCCFFFFFFFFTTTT(3S), CCCCCCCCFFFFFFFFTTTTMMMM(3S), SSSSCCCCFFFFFFFFTTTT(3S),
- SSSSCCCCFFFFFFFFTTTTMMMM(3S)
-
-
-
-
- PPPPaaaaggggeeee 11110000
-
-
-
-
-
-
- CCCCCCCCFFFFFFFFTTTTMMMMRRRR((((3333SSSS)))) CCCCCCCCFFFFFFFFTTTTMMMMRRRR((((3333SSSS))))
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- PPPPaaaaggggeeee 11111111
-
-
-
-
-
-
-